#include "../include/muduo/net/TcpClient.h"
#include "../include/muduo/net/EventLoopThread.h"
#include "../include/muduo/net/TcpConnection.h"
#include "../include/muduo/base/CountDownLatch.h"
#include <iostream>
#include <string>
#include <functional>

#if 1
class TranslateClient
{
    public:
        TranslateClient(const std::string &sip, int sport) 
        : _latch(1),
        _client(_loopthread.startLoop(), muduo::net::InetAddress(sip, sport), "TranslateClient")
        {
            _client.setConnectionCallback(std::bind(&TranslateClient::onConnection, this, std::placeholders::_1));
            _client.setMessageCallback(std::bind(&TranslateClient::onMessage, this, std::placeholders::_1,
                                    std::placeholders::_2, std::placeholders::_3));
        }
        // 建立链接服务器的接口，需要阻塞等待链接建立成功后返回
        void connect()
        {
            // 建立链接
            _client.connect();
            _latch.wait(); // 阻塞，等待链接建立成功
        }
        // 向建立链接的服务器发送数据
        bool send(const std::string &msg) {
            if (_conn->connected()) {  // 检查 _conn 有效性
                _conn->send(msg);
                return true;
            }
            std::cerr << "Connection not ready." << std::endl;
            return false;
        }

    private:
        // 用于链接成功的回调函数，链接一旦建立成功，需要唤醒阻塞
        void onConnection(const muduo::net::TcpConnectionPtr &conn) {
            if (conn->connected()) {
                _latch.countDown();  // 解除阻塞
                _conn = conn;
            } else {
                _conn.reset();
        }
    }
        // 收到消息之后处理的回调函数
        void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer* buf, muduo::Timestamp)
        {
            std::cout << "翻译消息: " << buf->retrieveAllAsString() << std::endl;
        }
    private:
       
        // 因为链接不一定建立成功，我们需要一个阻塞等待链接建立成功，使用可以阻塞等待的对象
        muduo::CountDownLatch _latch;
        // 同时我们需要一个对事件进行监控的对象，并且需要使用线程去执行，如果主线程执行就无法处理链接和处理消息
        // 我们这边直接使用EventLoopThread
        muduo::net::EventLoopThread _loopthread;
        // _loopthread对象用于初始化_client, 必须先初始化！！！！
        // client对象，主要用于设置回调函数，用于告诉客户端收到服务器的消息该如何进行处理
        muduo::net::TcpClient _client;
        // 获取建立成功的链接对象，调用指定的回调函数
        muduo::net::TcpConnectionPtr _conn;
};

int main()
{
    TranslateClient client("127.0.0.1", 8085);
    client.connect();
    while(1){
        std::string buf;
        // std::getline(std::cin, buf);
        std::cin >> buf;
        client.send(buf);
    }
    return 0;
}
#endif
